/*
 *  Copyright 2019-2020 Zheng Jie
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package com.gitee.vueantd.system.config.thread;

import com.gitee.vueantd.common.utils.SpringContextHolder;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.*;

/**
 * 用于获取自定义线程池
 *
 * @author Zheng Jie
 * @date 2019年10月31日18:16:47
 */
@Slf4j
public class ThreadPoolExecutorUtil {

  @Getter
  private static ExecutorService singleExecutorService = Executors.newSingleThreadExecutor();

  public static ThreadPoolExecutor getPoll() {
    AsyncTaskProperties properties = SpringContextHolder.getBean(AsyncTaskProperties.class);
    return new ThreadPoolExecutor(
            properties.getCorePoolSize(),
            properties.getMaxPoolSize(),
            properties.getKeepAliveSeconds(),
            TimeUnit.SECONDS,
            new ArrayBlockingQueue<>(properties.getQueueCapacity()),
            new TheadFactoryName()
    );
  }

  public static void shutdown(ExecutorService executorService) {
    executorService.shutdown();
    try {
      if (!executorService.awaitTermination(5, TimeUnit.SECONDS)) {
        log.error("Force shutdown the executor after wait 5 seconds timeout");
        executorService.shutdownNow();
      }
    } catch (InterruptedException e) {
      log.error("Failed to wait executor shutdown");
    }
  }
}
